
#include <iostream>
#include <memory>

/* 函数参数的传递:
 * 1. 值传递，修改函数的形参对实际参数没有影响
 * 2. 指针传参，传递实参的地址给形参，通过修改实参来修改实参
 * 3. 引用传参，参数的引用复制给形参，使得形参可以修改实参
*/

/*指针常量与常量指针
 * 指针常量：指针本身是一个常量，意味者指针指向的地址是固定的，但其内容可以被修改
 * 常量指针：指针指向的内容是固定的，但是指针可以改变，即指针指向的地址可以改变，但是不能通过指针修改内容
 * 指向常量的指针常量，地址和值都不能改变
*/
int main(int argc, char *argv[])
{
    int a = 10;
    int b = 11;


    //指针常量
    {
        int * const p = &a;
        //p = &b; 指针的地址不可以改变，编译无法通过
        *p = 11;
        printf("a: %d \n",*p);
    }


    // 常量指针
    {
        const int *p = &a;
        // *p = 12; 常量指针不可以通过指针来修改内容
        p = &b; //常量指针可以修改其指向的地址
        printf("a: %d \n",*p);

    }

    // 指向常量的指针常量
    {
        const int * const p = &a;
        // *p = 11; // 不可以修改内容
        // p = &b; // 不可以修改地址
    }
    

    return 0;

}